package br.com.cfccultura.admin.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.cfccultura.admin.model.dao.ICursoDAO;
import br.com.cfccultura.admin.model.enums.Ativo;
import br.com.cfccultura.admin.model.enums.TipoPeriodo;
import br.com.cfccultura.admin.model.vo.Curso;

@Repository
public class CursoDAO extends DAO implements ICursoDAO {

	@Override
	public List<Curso> consultar(Curso vo) {

		String sql = "SELECT cd_curso, nm_curso, vl_custo, vl_venda, vl_prova_custo, vl_prova_venda, qt_minima_presente, id_tipo_periodo, qt_carga_horaria, id_ativo FROM tb_curso where ";
		Object[] params;
		if(vo.getCodigo() != null) {
			sql += "cd_curso = ? ";
			params = new Object[]{vo.getCodigo()};
		} else {
			sql += "nm_curso like ? ";
			String desc = "%";
			if(vo.getNome() != null && !vo.getNome().equals("")) {
				desc = vo.getNome() + "%";
			}
			params = new Object[]{desc};
		}
		sql += "and id_ativo = 1 order by nm_curso";

		List<Curso> result = query(sql, params, new RowMapper<Curso>() {
			@Override
			public Curso mapRow(ResultSet rs, int arg1) throws SQLException {
				Curso vo = new Curso();
				vo.setCodigo(rs.getInt("cd_curso"));
				vo.setNome(rs.getString("nm_curso"));
				vo.setValorCusto(rs.getDouble("vl_custo"));
				vo.setValorVenda(rs.getDouble("vl_venda"));
				vo.setValorProvaCusto(rs.getDouble("vl_prova_custo"));
				vo.setValorProvaVenda(rs.getDouble("vl_prova_venda"));
				vo.setQtdeMinimaPresente(rs.getInt("qt_minima_presente"));	
				vo.setTipoPeriodo(TipoPeriodo.setValue(rs.getInt("id_tipo_periodo")));
				vo.setCargaHoraria(rs.getInt("qt_carga_horaria"));
				vo.setAtivo(Ativo.setValue(rs.getInt("id_ativo")));
				return vo;
			}
			
		});		
		
		return result;
	}
	
	@Override
	public Curso consultar(Integer codigo) {
		List<Curso> list = consultar(new Curso(codigo));
		return list.get(0);
	}
	
	@Override
	public void incluir(Curso vo) {
		String sql = "INSERT INTO tb_curso(nm_curso, vl_custo, vl_venda, vl_prova_custo, vl_prova_venda, qt_minima_presente, id_tipo_periodo, qt_carga_horaria) values(?,?,?,?,?,?,?,?)";
		update(sql, new Object[] {vo.getNome(), vo.getValorCusto(), vo.getValorVenda(), vo.getValorProvaCusto(), vo.getValorProvaVenda(), vo.getQtdeMinimaPresente(), vo.getTipoPeriodo().getValue(), vo.getCargaHoraria()});
	}
	
	@Override
	public void alterar(Curso vo) {
		String sql = "UPDATE tb_curso set nm_curso = ?, vl_custo = ?, vl_venda = ?, vl_prova_custo = ?, vl_prova_venda = ?, qt_minima_presente = ?, id_tipo_periodo = ?, qt_carga_horaria = ? where cd_curso = ?";
		update(sql, new Object[] {vo.getNome(), vo.getValorCusto(), vo.getValorVenda(), vo.getValorProvaCusto(), vo.getValorProvaVenda(), vo.getQtdeMinimaPresente(), vo.getTipoPeriodo().getValue(), vo.getCargaHoraria(), vo.getCodigo()});
	}
	
	@Override
	public void excluir(Integer id) {
		try {
			String sql = "DELETE FROM tb_curso where cd_curso = ?";
			update(sql, new Object[] {id});
		} catch(DataIntegrityViolationException e) {
			String sql = "UPDATE tb_curso set id_ativo = 0 where cd_curso = ?";
			update(sql, new Object[] {id});
		}
	}

}
